#ifndef PAIR_IMPL_H_
#define PAIR_IMPL_H_
#define IMPL_QUAL_PAIR(TYPE1, TYPE2, QUAL) \
ctl_res_void ctl_pair_##TYPE1##_##TYPE2##_ctor(ctl_pair_##TYPE1##_##TYPE2* pair) { \
  ctl_res_void res = {0}; \
  res.ec = EOK; \
  CHECK_EXEC_RES_RET_RES(TYPE1##_ctor(&(pair->first)), res, res); \
  CHECK_EXEC_RES_RET_RES(TYPE2##_ctor(&(pair->second)), res, res); \
  return res; \
} \
ctl_res_void ctl_pair_##TYPE1##_##TYPE2##_copy(ctl_pair_##TYPE1##_##TYPE2* dst, const ctl_pair_##TYPE1##_##TYPE2* src) { \
  ctl_res_void res = {0}; \
  res.ec = EOK; \
  CHECK_EXEC_RES_RET_RES(TYPE1##_copy(&(dst->first), &(src->first)), res, res); \
  CHECK_EXEC_RES_RET_RES(TYPE2##_copy(&(dst->second), &(dst->second)), res, res); \
  return res; \
} \
ctl_res_void ctl_pair_##TYPE1##_##TYPE2##_dtor(ctl_pair_##TYPE1##_##TYPE2* pair) { \
  ctl_res_void res = {0}; \
  res.ec = EOK; \
  CHECK_EXEC_RES_RET_RES(TYPE1##_dtor(&(pair->first)), res, res); \
  CHECK_EXEC_RES_RET_RES(TYPE2##_dtor(&(pair->second)), res, res); \
  return res; \
}

#define IMPL_PAIR(TYPE1, TYPE2) IMPL_QUAL_PAIR(TYPE1, TYPE2, )
#endif